#include "Chapter2.h"
#include <iostream>

// .cpp 获取对应的 .h 文件，实现定义的函数 和使用对应的数据

 void Chapter2::SetVal()
{
	// 有符号运算与无符号运算

	unsigned u = 10;
	int i = -42;

	std::cout << i + i << std::endl;
	std::cout << u + i << std::endl;


	// 字面值常量

}

 int reused = 42;  // 类的内部的全局作用域

 /*
 名字的作用域  内层作用域/外层作用域  类似局部变量和全部变量的感觉 
 */
 void Chapter2::Scope()
 {
	 std::cout << reused << std::endl;

	 int reused = 3;

	 // 在函数内，同名 没有特指的情况下，使用局部变量 (也就是内层用做域内)
	 std::cout << reused << std::endl;

	 // 使用 :: 获取到全局的变量 类似 this.
	 std::cout << ::reused << std::endl;
 }

 /*
  引用   &变量名B = 变量名A  看作用类似浅复制，又类似别名。
 */
 void Chapter2::Reference()
 {
	 int ival = 1024;
	 int &refVal = ival;

	 // 修改B 的同时会修改 A。 且A只能是具体数值，不能是计算得到的不定值
 }


 /*
 指针  存放某个对象的地址  1、本身就是一个对象，允许赋值和拷贝  2、定义的时候可以不初始化
 */
 void Chapter2::Pointer()
 {
	 // & 用来获取变量的地址 
	 int ival = 42;
	 int *p = &ival;

	 // p 存放变量 ival 的地址，或者说 p 是指向变量 ival 的指针

	 /* 指针值
	 1、指向一个对象
	 2、指向紧邻对象所占空间的下一个位置
	 3、空指针，意味着指针没有指向任何对象  （经常是使用的时候，对象被释放或者销毁，使用的时候报错）
	 4、无效指针，也就是上述情况之外的其他值 （其实就是不是自己想要的，但是不是空的）
	 */


	 // 利用指针访问对象，如果此时指向的内存地址没有东西，或者是空的，就有可能出现所谓的空指针报错
	 std::cout << *p;


	 // 空指针
	 int *p1 = nullptr;   // 等价于 int *p1 = 0;

	 // void* 指针 特殊指针类型，可用于存放任意对象的地址。实际操作再理解吧
 }


// 符号的使用需要看当前的环境  & 引用 ，  * 定义指针，但是也表示 与 运算 和 乘法 


 /*
复合类型
 */
 void Chapter2::CompositeType()
 {
	 // 很绕

	 // 比如  int* p   会让人难以区分，到底是 int类型数据  还是 指向int的指针

	 int* p1, p2;    // p1 指向int 的指针，p2 是int
	 int* p3, p4;   //  p3,p4 指向int 的指针
 }